/*
 * 
 * Se controlan los ingresos y los gastos tanto por franquicia como agrupación de franquicias.
 *
 */

package gestorvideoclub;

import java.util.Date;
import java.util.ArrayList;
import gestorvideoclub.jdbc.*;
import gestorvideoclub.util.*;
import java.util.Collection;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;

/**
 *
 * @author Rafa Berral
 */
public abstract class Contabilidad implements Comparable{

    private int Id;
    private Date fecha;
    private Double importe;
    private String descripcion;
    private String tipo;

    public Contabilidad(){}

    public Contabilidad(Date fecha, double imp, String desc, String tipo){
        this.fecha = fecha;
        this.importe = imp;
        this.descripcion = desc;
        this.tipo = tipo;
    }

    public int getId() {
        return Id;
    }

    public void setId(int Id) {
        this.Id = Id;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public Double getImporte() {
        return importe;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public void setImporte(Double importe) {
        this.importe = importe;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    @Override
    public String toString(){
        String cad = this.getTipo().toUpperCase();
        if(this.getTipo().equalsIgnoreCase("Ingreso")){
            cad += " +";
        }
        else{
            cad +=" -";
        }
        cad += this.getImporte()+" euros";
        return cad;
    }

    
    public int compareTo(Object o){
        Contabilidad contabilidad = (Contabilidad)o;
        int comp = this.getId() - contabilidad.getId();
        return comp;
    }
    

    //Metodo abstracto para que obligue a las subclases a sobreescribirlo.
    public abstract void insertarMovimiento(Contabilidad c);

    public static double obtenerBeneficios(Date fechaInicio, Date fechaFin){
        
        ArrayList listaGastos = GastoJDBC.consultarGastoPorFecha(fechaInicio, fechaFin);
        ArrayList listaIngresos = IngresoJDBC.consultarIngresoPorFecha(fechaInicio, fechaFin);
        double beneficios = 0;
        Iterator it;
        if(!listaGastos.isEmpty()){
            it = listaGastos.iterator();
            while(it.hasNext()){
                Gasto gasto = (Gasto)it.next();
                beneficios = beneficios - gasto.getImporte();
            }
        }
        else{
            
        }

        if(!listaIngresos.isEmpty()){
            it = listaIngresos.iterator();
            while(it.hasNext()){
                Ingreso ingreso = (Ingreso)it.next();
                beneficios = beneficios + ingreso.getImporte();
            }
        }
        else{
        }
        return beneficios;
    }

    public static Collection obtenerDetallesContabilidadPorFecha(Date fechaInicio, Date fechaFin){
        ArrayList listaGastos = GastoJDBC.consultarGastoPorFecha(fechaInicio, fechaFin);
        ArrayList listaIngresos = IngresoJDBC.consultarIngresoPorFecha(fechaInicio, fechaFin);
        SortedSet<Contabilidad> total = new TreeSet();
        total.addAll(listaGastos);
        total.addAll(listaIngresos);
        return total;
    }


}
